﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using CastleDefender.Platform.ScreenBehavior;
using CastleDefender.ConfigFolder;
using Microsoft.Xna.Framework.Graphics;

namespace CastleDefender.Platform.GameScene
{
    public partial class GamePlay : GameScene
    {
        #region VARIABLE

        private GameWorld scenePlay;
        private GameMenu sceneMenu;
        private GameWaiting sceneWaiting;
        private GameScene sceneCurrent;
        private GameHighScore sceneHighScore;
        private GameCredits sceneCredits;
        private GameHelp sceneHelp;
        private GamePause scenePause;
        private SpriteFont font;
        private TouchBehavior tbTouch;

        #endregion

        #region CONSTRUCTOR

        public GamePlay(Game myGame, ref TouchBehavior touch)
            : base(myGame, "")
        {
            tbTouch = touch;

            sceneMenu = new GameMenu(myGame, ref touch);
            sceneHighScore = new GameHighScore(myGame, ref touch);
            sceneCredits = new GameCredits(myGame, ref touch);
            sceneHelp = new GameHelp(myGame, ref touch);
            sceneWaiting = new GameWaiting(myGame);
            scenePause = new GamePause(myGame, ref touch);

            //Đưa các đối tượng vào danh sách quản lý
            lstComponents.Add(sceneMenu);
            lstComponents.Add(sceneHighScore);
            lstComponents.Add(sceneHelp);
            lstComponents.Add(sceneCredits);
            lstComponents.Add(sceneWaiting);
            lstComponents.Add(scenePause);

            sceneCurrent = sceneMenu;
            sceneCurrent.Show();

            font = myGame.Content.Load<SpriteFont>(Config.FolderFonts + "FontItems");

        }

        #endregion

        #region PUBLIC METHOD

        public override void Update(GameTime gameTime)
        {
            UpdateGame();
            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            base.Draw(gameTime);     
        }

        #endregion

        #region PRIVATE METHOD

        //Trình chiếu màn chơi
        private void ShowScene(GameScene Scene)
        {
            sceneCurrent.Hide();
            sceneCurrent = Scene;
            sceneCurrent.Show();
        }

        //Thiết lập trò chơi
        private void UpdateGame()
        {
            //Khi đang ở màn hình chơi
            if (sceneCurrent == scenePlay)
            {
                UpdateGameWorld();
            }

            //Khi đang ở màn hình Menu
            if (sceneCurrent == sceneMenu)
            {
                UpdateMenu();
            }

            //Khi đang ở màn hình điểm cao
            if (sceneCurrent == sceneHighScore)
            {
                UpdateHeigthScore();
            }

            //Khi đang ở màn hình credits
            if (sceneCurrent == sceneCredits)
            {
                UpdateCredits();
            }

            //Khi đang ở màn hình help
            if (sceneCurrent == sceneHelp)
            {
                UpdateHelp();
            }

            //Khi đang ở màn chờ
            if (sceneCurrent == sceneWaiting)
            {
                UpdateWaiting();
            }

            //Khi đang ở màn pause
            if (sceneCurrent == scenePause)
            {
                UpdateGamePause();
            }       
        }

        //Cập nhật các tùy chọn của menu
        private void UpdateMenu()
        {
            //Nếu lựa chọn là NewGame
            if (sceneMenu.SelectedIndex == 0)
            { 
                //Đến màn chờ
                ShowScene(sceneWaiting);

                //Khởi tạo màn chơi mới
                lstComponents.Remove(scenePlay);

                scenePlay = new GameWorld(Game, ref tbTouch,
                    Config.InitArrowNormal, Config.InitArrowFire, Config.InitArrowElectric,
                    Config.BowHeartCastle, 0, 1);
               
                lstComponents.Add(scenePlay);

            }

            //Nếu lựa chọn là HightScore
            if (sceneMenu.SelectedIndex == 1)
            {
                ShowScene(sceneHighScore);
            }

            //Nếu lựa chọn là Credits
            if (sceneMenu.SelectedIndex == 2)
            {
                ShowScene(sceneCredits);
            }

            //Nếu lựa chọn là Help
            if (sceneMenu.SelectedIndex == 3)
            {
                ShowScene(sceneHelp);
            }

            //Nếu lựa chọn là Quit
            if (sceneMenu.SelectedIndex == 4)
            {
                Game.Exit();
            }
        }

        //Cập nhật thay đổi của màn chơi
        private void UpdateGameWorld()
        {
            if (scenePlay.Pause)
            {
                ShowScene(scenePause);
            }

            //Khi thắng 1 cấp độ
            if (scenePlay.Win && scenePlay.End)
            {
                ShowScene(sceneWaiting);

                //Khởi tạo màn chơi tiếp theo
                //Lấy dữ liệu màn chơi trước
                int intHeart = scenePlay.Heart;
                int intAmountArrowNormal = scenePlay.AmountArrowNormal;
                int intAmountArrowFire = scenePlay.AmountArrowFire;
                int intAmountArrowElectric = scenePlay.AmountArrowElectric;
                int intScore = scenePlay.Score;
                int intLevel = scenePlay.Level + 1;

                lstComponents.Remove(scenePlay);

                scenePlay = new GameWorld(Game, ref tbTouch,
                    intAmountArrowNormal, intAmountArrowFire, intAmountArrowElectric,
                    intHeart, intScore, intLevel);

                lstComponents.Add(scenePlay);
            }

            //Khi thua
            else if (scenePlay.Lose && scenePlay.End)
            {
                ShowScene(sceneMenu);
                //Lưu điểm cao
                sceneHighScore.GetNewScore(scenePlay.Score);
            }
        }
        
        //Cập nhật thay đổi màn tạm dừng
        private void UpdateGamePause()
        {
            //Khi chọn tiếp tục
            if (scenePause.SelectedIndex == 0)
            {
                ShowScene(scenePlay);
            }

            //Khi chọn Menu
            if (scenePause.SelectedIndex == 1)
            {
                ShowScene(sceneMenu);
                //Thoát game thì tiến hành lấy điểm
                sceneHighScore.GetNewScore(scenePlay.Score);
            }
        }

        //Cập nhật thay đổi màn điểm cao
        private void UpdateHeigthScore()
        {
            if (sceneHighScore.Back)
            {
                ShowScene(sceneMenu);
            }
        }

        //Cập nhật thay đổi màn credits
        private void UpdateCredits()
        {
            if (sceneCredits.Back)
            {
                ShowScene(sceneMenu);
            }
        }

        //Cập nhật thay đổi màn Help
        private void UpdateHelp()
        {
            if (sceneHelp.Back)
            {
                ShowScene(sceneMenu);
            }
        }

        //Cập nhật thay đổi màn chờ
        private void UpdateWaiting()
        {
            if (sceneWaiting.Complete)
            {
                ShowScene(scenePlay);
            }
        }

        #endregion

    }
}
